#ifndef ERROS_H_INCLUDED
#define ERROS_H_INCLUDED

#define ERRO_HEADER                                            "[ERRO]"

/// --- "main.c" ---
#define ERRO_ARQUIVO_INEXISTENTE(nome)                         printf("%s Nao foi possivel abrir o arquivo:\n",ERRO_HEADER);printf("%s \"%s\"\n",ERRO_HEADER,nome)
#define ERRO_ARGUMENTOS(max)                                   printf("%s Ou existe um numero invalido no argumentos passados, ou\n",ERRO_HEADER);printf("%s eles extrapolaram a quantidade maxima permitida (%u)!\n",ERRO_HEADER,max)
#define ERRO_FUNCAO_NAO_ENCONTRADA(nome,ari)                   printf("%s A funcao pedida \"%s\" nao esta listada ou nao\n",ERRO_HEADER,nome);printf("%s tem aridade igual a quantidade argumentos passados: %u\n",ERRO_HEADER,ari)
#define ERRO_SEM_MEMORIA                                       printf("%s Acabou a memoria!\n",ERRO_HEADER)

/// --- "fileparser.h" ---
#define ERRO_REDECLARACAO(nome)                                printf("%s Tentativa de redeclarar a funcao \"%s\"!\n",ERRO_HEADER,nome)
#define ERRO_NAO_DECLARADA(inome)                              printf("%s Implementacao nao declarada: \"%s\"\n",ERRO_HEADER,inome)
#define ERRO_RECURSAO_INVALIDA(fun,tipo)                       printf(">>> %s(): recursao com tipo invalido: %d!\n",fun,tipo)
#define ERRO_RECURSAO_PASSO(nome)                              printf("%s Foi lido um passo de recursao (\"%s\")\n",ERRO_HEADER,nome);printf("%s sem que um caso base fosse lido antes!\n",ERRO_HEADER)
#define ERRO_RECURSAO_EOF(nome)                                printf("%s Fim do arquivo foi atingido antes que o passo\n",ERRO_HEADER);printf("%s da funcao de recursao \"%s\" fosse lido!\n",ERRO_HEADER,nome)
#define ERRO_RECURSAO_PASSO_INCORRETO(nome,linha)              printf("%s O passo da funcao de recursao \"%s\" (linha %u)\n",ERRO_HEADER,nome,linha);printf("%s nao pode ser lido. Ela sera ignorada!\n",ERRO_HEADER)
#define ERRO_RECURSAO_LEU_OUTRO_TIPO(nome,linha)               printf("%s Foi lida uma funcao de um tipo diferente onde se esperava\n",ERRO_HEADER);printf("%s o passo da funcao de recursao \"%s\" (linha %u).\n",ERRO_HEADER,nome,linha);printf("%s A funcao de recursao sera ignorada!\n",ERRO_HEADER)
#define ERRO_RECURSAO_LEU_OUTRA_BASE(nome,linha)               printf("%s Foi lida uma base de uma recursao onde se esperava\n",ERRO_HEADER);printf("%s o passo da funcao de recursao \"%s\" (linha %u).\n",ERRO_HEADER,nome,linha);printf("%s A funcao de recursao atual sera ignorada!\n",ERRO_HEADER)
#define ERRO_RECURSAO_ERRO_HEADER                              printf("%s Em uma funcao de recursao:\n",ERRO_HEADER)
#define ERRO_RECURSAO_NOMES_BASE_PASSO(basen,passon)           printf("%s A base \"%s\" e o passo \"%s\" deveriam ter o mesmo nome!\n",ERRO_HEADER,basen,passon)
#define ERRO_RECURSAO_TIPO_BASE_PASSO(basen,passon)            printf("%s A funcao \"%s\" deveria ser um caso base e\n",ERRO_HEADER,basen);printf("%s a funcao \"%s\" deveria ser um passo de recursao.\n",ERRO_HEADER,passon)

/// --- "functionimplementation.h" ---
#define ERRO_TIPO_INVALIDO(fun,tipo)                           printf(">>> %s(): tipo \"%d\" invalido!\n",fun,tipo)
#define ERRO_TIPO_INCORRETO(fun,tipo)                          printf(">>> %s(): esta funcao nao trata funcoes PR do tipo \"%s\"!\n",fun,get_tipo_nome(tipo))

/// --- "functionlist.h" ---
#define ERRO_PRIMITIVA_INCORRETA(fun,tipo)                     printf(">>> %s(): funcao PR tipo \"%s\" nao deveria ter flag \"primitiva\"!\n",fun,get_tipo_nome(tipo))
#define ERRO_ARGUMENTOS_ARIDADE(fun,tam,ari)                   printf(">>> %s(): quantidade de argumentos (%u) difere da aridade funcao (%u)!\n",fun,tam,ari)
#define ERRO_ARGUMENTOS_VAZIOS(fun)                            printf(">>> %s(): zero argumentos!\n",fun)
#define ERRO_ARGUMENTOS_EXTRAPOLOU(fun,tam,max)                printf(">>> %s(): a quantidade de argumentos (%u) extrapolou o maximo (%u)!\n",fun,tam,max)
#define ERRO_IMPLEMENTACAO_NULA(fun,nome)                      printf(">>> %s(): A funcao \"%s\" tem implementacao nula!\n",fun,nome)
#define ERRO_PROJECAO_LIMITE(fun,ui,limite)                    printf(">>> %s(): indice da projecao invalido (%u)! Ele tem de estar entre 1 e %u (inclusive).\n",fun,ui,limite)

/// --- "functionparser.h" ---
#define ERRO_SINTAXE                                           printf("%s Sintaxe incorreta!\n",ERRO_HEADER)
#define ERRO_FUNCAO_BASICA(fun)                                printf("%s Re-declaracao da funcao PR basica \"%s\".\n",ERRO_HEADER,fun)
#define ERRO_ARGUMENTO_DUPLICADO(var,fun)                      printf("%s Argumento \"%c\" esta duplicado na funcao \"%s\"!\n",ERRO_HEADER,var,fun)
#define ERRO_IMPLEMENTACOES_MAXIMO(max)                        printf("%s Numero maximo de implementacoes de funcoes extrapolado (%u)!\n",ERRO_HEADER,max)

// "igualdade ---> fundef '=' funimpl":
#define ERRO_ARIDADE_DIFERENTE(ndef,nimpl,adef,aimpl)          printf("%s As funcoes \"%s\" e \"%s\" tem aridades diferentes (%u e %u)!\n",ERRO_HEADER,ndef,nimpl,adef,aimpl)
#define ERRO_ARGUMENTOS_DIFERENTES(ndef,nimpl)                 printf("%s Os argumentos das funcoes \"%s\" e \"%s\" sao diferentes!\n",ERRO_HEADER,ndef,nimpl)

// "igualdade ---> fundef '=' funnome '(' internas ')'":
#define ERRO_COMP_PROJECAO_LIMITE(limmax,qinternas)            printf("%s O limite maximo da projecao (%u) e a quantidade\n",ERRO_HEADER,limmax);printf("%s de funcoes internas da composicao (%u) devem ser iguais!\n",ERRO_HEADER,qinternas)

// "funimpl ---> funnome '(' vars ')'":
#define ERRO_PROJECAO_NOME(nome)                               printf("%s Nome da projecao tem de comecar com \"U\".\n",ERRO_HEADER);printf("%s Ao inves disso, comecou com \"%c\".\n",ERRO_HEADER,nome)
#define ERRO_PROJECAO_LIMITE_ARIDADE(limmax,ari)               printf("%s Limite maximo da projecao (%u) e sua aridade (%u) devem ser iguais!\n",ERRO_HEADER,limmax,ari)
#define ERRO_PROJECAO_INDICE(indice,limmax)                    printf("%s Indice da projecao (%u) deve estar entre 1 e %u (inclusive)!\n",ERRO_HEADER,indice,limmax)

// "igualdade ---> funrec_base_def '=' funrec_base_impl"
#define ERRO_RECURSAO_CONSTANTE_REQUERIDA(nome)                printf("%s Como \"%s\" tem aridade 1, era esperado que\n",ERRO_HEADER,nome);printf("%s a sua implementacao fosse uma constante!\n",ERRO_HEADER)
#define ERRO_RECURSAO_CONSTANTE_PROIBIDA(nome)                 printf("%s Como \"%s\" tem aridade maior que 1,\n",ERRO_HEADER,nome);printf("%s sua implementacao nao pode ser uma constante!\n",ERRO_HEADER)
#define ERRO_RECURSAO_ARIDADE_DIFERENTE(impln,impla,defn,defa) printf("%s A aridade da funcao \"%s\" (%u) deveria ser exatamente uma\n",ERRO_HEADER,impln,impla);printf("%s unidade a menos que a aridade da funcao \"%s\" (%u)!\n",ERRO_HEADER,defn,defa)

// "igualdade ---> funrec_passo_def '=' funrec_passo_impl":
#define ERRO_RECURSAO_NOME_DIFERENTE(decn,chamn)               printf("%s A declaracao da funcao de recursao \"%s\" e sua\n",ERRO_HEADER,decn);printf("%s chamada recursiva \"%s\" deveriam ter o mesmo nome!\n",ERRO_HEADER,chamn)

// "funrec_base_def ---> palavra '(' varspre DIGITO ')'":
#define ERRO_RECURSAO_NAO_ZERO(nome,esperado,num)              printf("%s Esperado %u como ultimo argumento\n",ERRO_HEADER,esperado);printf("%s da funcao de recursao \"%s\". Leu %u.\n",ERRO_HEADER,nome,num)
#define ERRO_RECURSAO_MAX_ARGUMENTOS(nome,max)                 printf("%s A quantidade de argumentos da funcao de recursao \"%s\"\n",ERRO_HEADER,nome);printf("%s extrapolou a quantidade maxima permitida: %u!\n",ERRO_HEADER,max)

#endif // ERROS_H_INCLUDED
